package reflect;

import java.io.File;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

/**
 * 调用Test3所在包中那些类名字含有s的无参方法
 */
public class Test3 {
    public static void main(String[] args) throws Exception {
        /*
        1.通过test3类定位它所在的目录
        2.通过test3类获取其包名
         */
        File dir = new File(Test3.class.getResource(".").toURI());
        String packName = Test3.class.getPackage().getName();

        /*
        3.遍历test3所在目录下所有的文件，截取其.class之前的名字
         */
        File[] subs = dir.listFiles(f -> f.getName().endsWith(".class"));
        for (File sub : subs) {
            String fileName = sub.getName();
            String className = fileName.substring(0, fileName.indexOf("."));// substring(beginIndex,endIndex);;;indexOf(".")返回"."的数组下标
            /*
            4.通过包名.类名的方式逐一加载类对象
            通过类对象实例化
             */
            Class cls = Class.forName(packName + "." +className);
            Object obj = cls.newInstance();
            /*
            5.通过类对象获取其定义的所有方法
            找到无参方法并执行
             */
            Method[] methods = cls.getDeclaredMethods();
            for (Method method : methods) {
                if (method.getParameterCount() == 0 && method.getName().contains("s")) {
                    method.invoke(obj);
                }
            }
        }
    }
}
